using System;
using System.Collections.Generic;
using System.Text;

namespace RRHH.Competencias.DataAccessLayer
{
    /// <summary>
    /// Grupo de metodos para el tratamiento de valores que deben ser almacenados en la
    /// base de datos
    /// </summary>
    static class DALSqlServerFieldFormat
    {
        public static string fechaSQL(Object fecha)
        {
            if (fecha == null)
            {
                return "null";
            }

            else if (fecha.GetType().FullName == "System.DateTime")
            {
                DateTime f = (DateTime)fecha;

                if (f.CompareTo(new DateTime(1, 1, 1)) == 0)
                {
                    return "null";

                }

                return "'" + ((DateTime)fecha).ToShortDateString() + "'";
            }
            else if (fecha.GetType().FullName == "System.String")
            {
                if (((String)fecha).Length > 0)
                {
                    return "'" + Convert.ToDateTime(fecha).ToShortDateString() + "'";
                }
                else
                {
                    return "null";
                }
            }
            return "null";
        }

        public static string fechaHoraSQL(Object fecha)
        {
            DateTime f;
            
            if (fecha == null)  return "null";

            if (fecha.GetType().FullName == "System.DateTime")
            {
                f = (DateTime)fecha;  
            }
            else if (fecha.GetType().FullName == "System.String")
            {
                if (!DateTime.TryParse(fecha.ToString(), out f)) return "null";
            }
            else
            {
                return "null";
            }

            if (f == DateTime.MinValue) return "null";
            return "'" + f.ToString("dd/MM/yyyy HH:mm:ss") + "'";
        }

        public static string textoSQL(string texto, bool mayusculas, bool minusculas, bool mayusMinus)
        {
            if (texto != null)
            {
                texto = texto.Replace("'", string.Empty);

                if (mayusculas)
                {
                    return "'" + texto.ToUpper().Trim() + "'";
                }
                else if (minusculas)
                {
                    return "'" + texto.ToLower().Trim() + "'";
                }
                else if (mayusMinus)
                {
                    if (texto.Length > 0)
                    {
                        return "'" + texto.Substring(0, 1).ToUpper().Trim() + texto.Substring(1, texto.Length - 1).ToLower().Trim() + "'";
                    }
                    else
                    {
                        return "'" + texto.ToUpper().Trim() + "'";
                    }
                }
                return "'" + texto.Trim() + "'";
            }
            else
            {
                return "null";
            }
        }

        /// <summary>
        /// Controla que el texto recibido sea cadena. Si no lo es devuelve blanco.
        /// Por otro lado, elimina caracteres peligrosos de la cadena
        /// </summary>
        public static string controlarCadena(string cadena)
        {
            if (cadena != null && cadena != "&nbsp;")
            {
                return limpiarCadena(cadena);
            }
            else
            {
                return string.Empty;
            }
        }

        private static string limpiarCadena(string cadena)
        {
            cadena = cadena.Replace("'", string.Empty);
            cadena = cadena.Replace("(", string.Empty);
            cadena = cadena.Replace(")", string.Empty);
            cadena = cadena.Replace("\"", string.Empty);
            cadena = cadena.Replace("<", string.Empty);
            cadena = cadena.Replace(">", string.Empty);
            cadena = cadena.Replace(",", string.Empty);
            cadena = cadena.Replace(";", string.Empty);

            return cadena;
        }

        public static string textoSQL(string texto)
        {
            return DALSqlServerFieldFormat.textoSQL(texto, false, false, false);
        }

        public static string numeroSQL(string texto, bool aceptaCero, int decimales)
        {
            Double temp;
            String aux;
            
            try
            {
                texto = texto.Replace(".", ",");
                temp = Convert.ToDouble(texto);
                
                if (temp == 0 && !aceptaCero)
                {
                    return "0";
                }
                else
                {
                    switch (decimales)
                    {
                        case 0:
                            return "'" + texto.Trim() + "'";
                        case 1:
                            aux = temp.ToString("#.0");
                            return "'" + aux.Replace(",", ".").Trim() + "'";
                        case 2:
                            aux = temp.ToString("#.00");
                            return "'" + aux.Replace(",", ".").Trim() + "'";
                        case 3:
                            aux = temp.ToString("#.000");
                            return "'" + aux.Replace(",", ".").Trim() + "'";
                        case 4:
                            aux = temp.ToString("#.0000");
                            return "'" + aux.Replace(",", ".").Trim() + "'";
                        case 5:
                            aux = temp.ToString("#.00000");
                            return "'" + aux.Replace(",", ".").Trim() + "'";
                        case 6:
                            aux = temp.ToString("#.00000");
                            return "'" + aux.Replace(",", ".").Trim() + "'";
                    }
                }
            }
            catch (Exception)
            {
                return "0";
            }

            return "0";
        }

        /// <summary>
        /// Determina si una cadena es una fecha
        /// </summary>
        /// <param name="expression">Cadena a evaluar</param>
        /// <returns>True si es fecha, false en caso contrario</returns>
        public static bool IsDate(string expression)
        {
            if (expression == null) return false;
            DateTime fecha;
            return DateTime.TryParse(expression, out fecha);
        }

        /// <summary>
        /// Determina si una cadena es un numero
        /// </summary>
        /// <param name="anyString">Cadena a evaluar</param>
        /// <returns>True si es fecha, false en caso contrario</returns>
        public static bool IsNumeric(string anyString)
        {
            if (anyString == null) anyString = string.Empty;

            if (anyString.Length > 0)
            {
                double dummyOut = new double();
                System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("es-AR", true);

                return Double.TryParse(anyString, System.Globalization.NumberStyles.Any, cultureInfo.NumberFormat, out dummyOut);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Convierte una cadena en su representacion numerica, quitando todos
        /// aquellos caracteres no numericos
        /// </summary>
        /// <param name="str">Cadena a evaluar</param>
        /// <param name="decimals">Si el numero debe incluir decimales (aqui considera el punto decimal como valido)</param>
        /// <returns>Cadena resultante con numeros y punto decimal si se indico</returns>
        public static string MakeNumeric(string str, bool decimals)
        {
            bool hasdec = false;
            string ret = string.Empty;

            for (int i = 0; i <= str.Length - 1; i++)
            {
                if (Char.IsDigit(str, i))
                {
                    ret += str[i];
                }
                else if (decimals && str[i] == '.' && !hasdec)
                {
                    ret += str[i];
                    hasdec = true;
                }
            }

            return ret;
        }
    }
}
